perm filename PASNOT.ARR[UP,DOC]2 blob sn#463019 filedate 1979-08-06 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	user notes from LOTS community
C00011 00003	* * * * *  local user notes (SU-AI)  * * * *	Last: EJG 6-Jul-79
C00027 00004	History of changes made at LOTS/SAIL	ARR	11-jul-79
C00038 00005	∂24-jun-79  1503	ARR  Linkage conventions of the PASCAL/PASSGO/LOTS compilers
C00048 00006	∂ 8-jul-79  1628	ARR  Description of the symbol table data structure
C00053 00007		THE STRUCTURE DESCRIPTOR BLOCK:
C00062 00008		THE IDENTIFIER DESCRIPTOR BLOCK:
C00072 00009		THE DISPLAY ARRAY:
C00074 00010		BIBLIOGRAPHY AND ADDRESSING INFORMATION:
C00076 00011	∂10-jul-79  1628	ARR  Packing Policy
C00081 00012		EXAMPLES:
C00083 00013	∂20-jul-79  1433	ARR  List of Error messages
C00093 ENDMK
C⊗;
user notes from LOTS community
SUBJECT: Pascal compiler observations.


Observations on the Pascal compiler.
	(as made by J.JHENN)
1.  In @EXECUTE mode the /list option causes the listing to appear
    on the line printer.  This does not happen in @PASCAL mode.
2.  In @PASCAL mode:
	If /LIST is specified, LIST FILE must be.
	/CREF after the source file causes CROSS REFERENCE, with the 
	   following properties:
		A * is printed to which you give the name of the source
		file without extension.

		The list file (.LST) contains pretty printed listing 
		and cross reference.  The file with the source
		name and extension .NEW is a formatted listing.
3.  The compiler utilizes PPN, which is no problem, if you use
    your own directory.
4.  On the run time environment.
    Using READ/WRITE.  To get TTY (i.e. the teletype), use
    TTY as the file name. The default file names are INPUT for READ/READLN,
    and  OUTPUT for WRITE/WRITELN. MESSAGE is always sent to TTY.
5.  When the compiler starts using TTY.  It first prints a *,
    prompting to fill the input buffer.  Note that this occurs
    prior to executing other statements (including writes
    which are before your reads).  No big deal --
    just enter CR and then continue as usual.
END OF OBSERVATIONS.
-----------------------------------------------------------------------
A.ARMANDO, 01/12/78
Important details that are easy to forget and will give you problems:
  1.-  If you forget to put a star (*) after the names of any parameter
	file which is going to be used for input, it will be rewritten,
	instead of reset. This causes a new,empty version of the file 
	to be created, and your input is not accessible anymore. The 
	program will stop with the message INPUT DATA ERROR IN FILE ...
	when the first input is attempted.  
  2.-  If you give a device name, such as TTY: to the prompt for the 
	actual names of the parameter files, no error message will be 
	sent, but your description will be ignored, and the file name 
	will be assigned in the same way as if you hit return only.  
  3.-  Remember the way a real number is defined. If your program needs
	a real number as input, and at run time it takes a number such 
	as .3 or 456 or 23., it will report an INPUT DATA ERROR IN FILE ...
	 They should be typed as 0.3 and 456.0 and 23.0 .  
  4.-  When you are prompted for the file names for files INPUT and 
	OUTPUT, the only extensions allowed are INP and OUT respectively,
	and the name of the file should not exceed six characters. So, 
	AA.INP is a valid file name for INPUT, but ANY.THING and 
	LONGNAME.INP are not. For other parameter files, the only res-
	triction is size: up to 6 chars for the name, and up to 3 for
	the extension.
  5.-  If you use READLN on TTY, then at runtime you will have to type
	two <RETURN> instead of one. The first is taken as the end-of-line
	character, and the second indicates end of input, as usual.
-----------------------------------------------------------------------
On the USE of INPUT and OUTPUT as standard files.
          (observations by J.JHENN)

The standard files INPUT and OUTPUT are predeclared as TEXTFILES,
by the compiler.  They operate in two different ways.

First, if the files INPUT and OUTPUT appear in the file header,
then there names are prompted for.  They act as described 
in the previous note (by A.ARMANDO).

If the file names INPUT and OUTPUT do not appear in the file
header.  Then the files will have the names INPUT.. and OUTPUT..
respectively.  Additionally, both files will be reset and the
file OUTPUT.. will be rewritten (i.e. a new creation if it 
already exists - otherwise a new file).  This is equivalent
to putting INPUT*,OUTPUT in the file header and replying to the prompt
   		INPUT= input..
		OUTPUT= output..
__________________________________________________________________
A.ARMANDO  01/17/78
	Another warning:  INPUT and OUTPUT are predeclared for you by
	PASCAL, so they SHOULD NOT EVER be included by you in a VAR
	declaration. If you declare them, for some unknown reason they
	end up being declared to the system as BINARY, and you will not
	be able to read characters from INPUT.
----------------------------------------------------------------------
* * * * *  local user notes (SU-AI)  * * * *	Last: EJG 6-Jul-79

∂ 6-Jul-79  1326	EJG  Loader halt at 2704 (from GRIPES.TXT[2,2])
∂15-Feb-79 JRQ	16-Feb-79 EJG	running PASCAL jobs
Whenever I try to execute a PASCAL job, the loader comes up
with a message "Halt at user 2704" which seems to be
related to the absence/incorrectness of the PASCAL library.
The same program runs at SUMEX  (in fact the only library
functions it uses are MIN SQRT and RANDOM). Any suggestions?
JRQ

EJG - The halt at 2704 is a bugtrap in the LOADER, apparently reflecting
the fact that the SAIL version of the LOADER cannot handle some of the
more modern relocatable file block types, which are used in the PASCAL
scientific subroutine library.

Until this bug/lack of feature in the LOADER is fixed (which may be a
while), you have to use LINK-10 to load any .REL file which uses the
PASCAL scientific subroutines.  This may be done by using the /LINK switch
in COMPILE, LOAD, or EXECUTE commands.  For further information on using
LINK-10, see the monitor command manual and/or LINK.JFR[S,DOC].

Using LINK-10 like this has another questionable "feature," namely that
once the core image is set up, just before exiting or tranferring to
the user's start address, the linker will occasionally get an ill
mem ref (at loc 10?).  However, my experience has been that the core
image is indeed O.K., so you can simply say START or SSAVE or whatever
you were planning on doing with that core image.

∂ 5-jul-79  0849	ARR  LOTS version is back up

The LOTS version is back up again. When it was released on monday, some 
people had problems, so it was taken away and checked. The three problems
that were rported have been corrected:
	1. The runtime library was missing one entry point, for a routine
    that checks for nil or undefined pointers.
	2. The default memory size is set to the maximum at LOTS, where the
    virtual memory is paged, while here, where it is only two chunks, that
    is bad memory management.
	3. Due to a typo, the compiler was generating wrong code, that would
    destroy the stack pointer whenever you would do an assignment to an
    element of an array in whose type the range of the subscript had an 
    upper bound of exactly 15.

One extra feature of the new version is that now, when you cal it directly,
it will no complain if you don't close the bracket when giving it the name
of a file in another area.
					Armando.

∂ 2-jul-79  1146	ARR  LOTS version is up here

The most recent LOTS version of the PASCAL compiler has been brought up to
SAIL, with some improvements. The old one is still available by .R PASOLD
.R OPASC still exists also, although I don't really know why we keep it.
PASCAL is not officially supported yet, although your gripes will get an
answer.

If you DON'T know PASCAL/LOTS, you can see all the changes in page 4 of this
	file. Main additions are the /PROFILE switch and the string package.

If you know PASCAL/LOTS, you will notice that PASCAL/SAIL:

0. accepts the switch (LOG)(compiler option (*$G*) ) : using it produces 
	a file FOO.LOG (FOO.PAS is your source) containing a copy of your
	terminal error messages. to use it, you say
		.EXE FOO(LOG)
1. keeps the line/page count correctly matched with E.
2. will give you page numbers as it goes compiling, and for long pages,
	it will give the line count every 500 lines.
3. In error messages, it will give you both the line/page number and the 
	name of the procedure you are in.
4. When using input files from TTY:, now you get a silly prompt that tells
	you what to do, instead of just entering LINE mode.
5. If you use the predefined procedure ASKFILENAME, now it needs one more
	argument. READ PASMAN/42p for details.
6. When giving filenames at runtime, you can ommit the right bracket, just
	like everywhere in the system.

The documentation (PASHLP, PASMAN, PASCAL) has been updated accordingly.

***   YOUR OPINION, PLEASE   ***

PASSGO and PCROSS are candidates for implementation here. Please give your
	opinion on their usefulness to ARR

***   FUTURE   ***

In the (more or less) near future, the next additions are planned:
	(besides fixing any bugs that can be fixed)

1. /PROFILE will give procedure timing, besides statement counting
2. Some sort of conditional compilation, based in the OPTIONS mechanism
	that is, comments that start with $).
3. A cross referencer that does not do 'prettyprinting', derived from PCROSS
4. A prettyprinter that does not lose as mucha s PCROSS (Does anybody have
	FORMAT (PUG notes #13) online?)
5. More frienly interactive I/O routines.
6. Larger sets, and upper and lower case in type CHAR

The next misfeatures are still supported, but they will be suppressed soon,
	unless strong opposition is shown:

The current meaning of the characters " and # (What? you don't know their
	meaning? Good! don't ask.)

Comments, complaints, suggestions, etc. to ARR

If you know of someone who is willing to do some work in MACRO for the user
	community, let me know.


***********

∂22-jun-79  1825	ARR  Explanation of the problems with TTY: files

There is one bug, that by virtue of its being documented here will from now
on be called a feature, that relates the use of the device TTY: in files that
are parameters of PASCAL programs.
The operating system in this computer (SAIL) will not allow two channels to 
be directed to the terminal for input simultaneously; same thing with output.
The effects are several fold:
	1. When you are using the debug ( the (*$d+*) option ) and you declare
		one of your parameter files as tty:foo, then you will never
		be able to execute your program: when the debuger should
		prompt you with 'DEBUG: PELOS" and then put the "$", it will
		send them into the infinity, and your terminal will enter
		LINE mode, and you cannot get out of it.
	2. If you declare two of your parameter files as TTY:Foo and TTY:F2,
		the same effect will be reached when you give the second one.
	3. If you use in your program the pascal-defined file TTY, and you
		declare one of your program parameters as TTY:FOO, the former
		will be lost. An attempt to read from TTY will put you in
		LINE mode; anything WRITtEn to TTY will float in limbo.
EJG was nice enough to trace this bug from the symptoms to the origin. He and
I discussed what it would involve to fix it. We should either:
(a) change this Tops-10 restriction (not our bag, I guess) or
(b) Get the runtimes (written in MACRO) to be smart enough to look around and
	find out if some other channel is already tied to TTY: on the same
	mode, and if so, find out its (PASCAL-created) file descriptor block
	and kludge things for both files to go to the same channel, and through
	the same file buffers. Not an easy thing to do for a PASCAL hacker.
	We would need an assembler-level hacker.

Open questions:
	1. Any volunteers?  If so, please contact me. (ARR).
	2. Do you know if this restriction is standard in other DEC-10 sites?
		if so, please let me (ARR) know. Thanks.

********

∂05-Oct-78  0307	EJG  Kluge to allow large one-segment PASCAL programs

PDP10 PASCAL is quite strongly oriented towards using two-segment core
images, with the lower containing mostly variable information and the
upper containing pure code.  However, for address space reasons (at least)
it occasionally becomes desirable to run a PASCAL program in one segment,
to let it use all of one address space (2↑18 words).

This note describes a kluge which allows for this in a somewhat limited
and very unclean way.  Perhaps it will be obsoleted someday when someone
figures out how to "do it right," e.g. implements a switch similar to
SAIL's "/NOSAISEG".

First, the PASCAL DEBUG package makes a number of assumptions about
absolute locations of some data, so single-segment programs cannot be run
with DEBUG (*$D+*) turned on (until such dependencies are removed).
However, note that this does not exclude running with runtime tests
(*$T+*) turned on (as is the default).  The procedure outlined below will
load the PASCAL program with DDT, which can be used as an assembly-level
debugger if this is any help.

To start building the single-segment core image, make sure that no (*$D+*)
options appear in the source program which would invoke PASCAL DEBUG.
Also, chances are that you want to specify some large amount of runcore
for the program (or else you wouldn't be bothering with this procedure),
such as (*$R240*).  Then create the relocatable object file with a command
such as:
	.COMPILE FOOBAR
...which compiles FOOBAR.PAS into FOOBAR.REL.

Next use LINK to create the forced single-segment core image (containing
DDT), as follows:
	.R LINK
	*/SEGMENT:LOW=FOOBAR
	*/SEGMENT:LOW/SYSLIB=
	*/TEST:DDT=
	*/G=
(sometimes LINK exits with "Ill mem ref at user 10", but the core image it
builds seems to be complete enough to work anyway...sigh)

Now, before saving (or running) the core image, it is necessary to do a
small amount of patching with DDT, as follows (here things the user types
will be enclosed in braces "{}"):
	.{DDT<return>}
	FOOBAR$:  {jobsa[}  <some numbers>{<tab>}
	<some instruction>{<return>}
	{.+36/}  <some instruction>
...it may now be necessary to search about a bit with {<line feed>} and/or
{↑} (up arrow) to find the right three instructions, but once you find
them you proceed like this:
	40641/  HRRZM 16,.JBDA+3	{JFCL<line feed>}
	40642/  SKIPE .JBDA+6		{JFCL<line feed>}
	40643/  XCT .JBDA+6		{JFCL<line feed>}
	40644/  JRST 40357		{<CALL> or <CTRL-C>}

The single segment core image should now be set up, ready to be saved
with the SAVE command (not SSAVE), or run with the START command.  Believe
it or not this mess really does tend to work!  Good luck...
History of changes made at LOTS/SAIL	ARR	11-jul-79

∂ changes made to PASCAL/PASSGO on 11-jul-79:	ARR

1.	Error messages show two lines: the one in error an the previous one.
2.	PCREF is up: it is the cross-referencing part of PCROSS/LOTS.
	.READ PCREF for details.
3.	The /PROFILE switch has been implemented properly. It produces
	a listing with statement count information, similar to that of the
	ALGOLW compilers. To use it:

		.EXE MYPROG(PROFILE)

		   ... after your program has run :
		.R PCREF

	The file MYPROG.KNT contains intermediate information. PCREF will
	leave it empty after processing it. Your listing is in MYPROG.LST.
	None of the other PCREF options is given to you by default, but 
	you can get them there by giving them to the compiler together
	with the (PROFILE) switch, e.g. .EXE MYPROG(PROFILE,CROSS:15).

∂ changes made to PASCAL/PASSGO on 1-jul-79:	ARR

1.	Now it can see page marks in files with no SOS lines. All PASCAL
	programs can also. See COPY.PAS[PAS,SYS] for a sample.
2.	In compile-time error messages, it will give both the line/page
	number and the name of the procedure in which it occured.
3.	A bug was fixed: if you would have an array with more than
	377777B elements (max half-word positive integer), it would give you
	a runtime error ARRAY SUBSCRIPT OUT OF BOUNDS when your subscript 
	would go over that value.
4.	A new switch was added, to provide for a hardcopy of the messages
	sent to the TTY, without getting a listing of all the source.
	use the switch (LOG), compiler option (*$G+*). The log file will be
	called XXXXXX.LOG , where XXXXXX.PAS is your source file.
	NOTICE that the switch is not /LOG, but (LOG). This is because SNAIL
	does not know this switch. So, to compile FOO.PAS and get a logfile,
	say:
		.COMP FOO(LOG)
5.	When a PASCAL program prompts for file names at runtime, you can 
	ommit the right bracket in the PPN, just like everywhere else in the
	system.

∂ changes made to PASCAL/PASSGO on 31-may=79:	ARR

1.	MIN and MAX require at least two parameters. one parameter will
	produce a compilation error message.
2.	the switches [NO]TTY and [NO]OUTPUT were added, to tell the 
	compiler that external/fortran procedures will [will not] use
	the input file TTY and the output file OUTPUT. (this avoids the
	silly message prompt, and your having an empty OUTPUT file always)
	the compiler options are (*$Y-,O-*). default is ON in both.
3.	A bug in MESSAGE was fixed, by which it would fail when trying
	to write a scalar as the last thing.

∂ changes made to PASCAL/PASSGO on 27-mar-79	ARR

	(*NOTE: the interfase of /PROFILE with the system has not been 
	   tested yet. ARR 2-jul-79*)
1. The switch /PROFILE was added. If you EXECUTE a program with that
	switch, PCROSS will be started after your program, and it will
	show on the left margin the number of times that each basic block
	was executed. Only the first statement of each basic block will
	have a count.
	To get a profile of MYPROG.PAS :
		@EXECUTE MYPROG/PROFILE
	Once your program and PCROSS have run, MYPROG.CRL will contain
	statement counts on the left margin, after the line number.
	the compiler option to use in the source is (*$C+*).
2. the procedure SETRAN(i: integer) is now supported. It allows to reset
	the seed for the function RANDOM(dummy:real). For details on how
	they work, see the FORTRAN manual.
3. Files with no line numbers are treated in a nicer way now. The compiler
	doesn't see the page marks yet (any volunteers to fix that one?)
	(*this one improved. ARR 1-jul-79*)
	but now:
		a. In an error message, it gives you the procedure name
		   instead of the page number.
		b. The line increment was changed to one.
		c. It produces a file XXXXXX.PRC, where XXXXXX is the name 
		   of your source file, that gives, for each procedure,
		   the name, and the line numbers for the header line,
		   the BEGIN statement and the END statement. This can help
		   you ubicate the errors and also use the debugger.
4. Fixing small bugs and making cosmetic changes.

Things that are being done now:
	A. Conversion to native DEC-20 mode. This will speed things up
		between a 20 and a 50%.
	B. Improving (first af all, fixing) the debugger.
	C. /PROFILE will eventually give also timing counts for each
		procedure.

Comments, complains, suggestions, etc. to A.ARMANDO at LOTS, 
	CSL.ARMANDO at SCORE, ARR at SAIL.

∂ changes made to PASCAL/PASSGO on nov-1-78:	ARR

	+ A String Manipulation Package was added. See the documentation
	   on DOC:PASCAL.STRINGS
	+ The file OUTPUT will not be created if you don't use it. 
	+ There was a bug by which, if you would declare any file in the
	   program header (as a program parameter), INPUT and OUTPUT would
	   not be open unless they were also in the header. It was fixed.
	+ The number of errors detected was not being counted right. Now
	   it is.

∂ changes made to PASCAL during summer 1978:	ARR

1. Bugs that were fixed:
	+ It would take '\' as an end of comment.
	+ If your program had a lot of comments following each other
	  (not one big comment, but open-close-open.... comment)
	  it would run out of memory space.(it would scan recursively)
	+ when using the CREF switch, it was not passing the file names
	  to PCROSS.
	+ to assign a parameter file to TTY: you would have to type 
	   TTY:FOO instead of only TTY:
	+ The procedures DATE and TIME were returning empties.
	+ It would try to LOAD the object file even if there were errors.
	+ Sometimes, it would produce, without aparent reason, the message:
		STACK OVERRUNS HEAP: RETRY WITH MORE CORE

2. Things changed in the compiler:
	+ Now, the PASCAL programs will detect pointers that are nil or
	   undefined, and isue the appropriate error message.
	+ Now the bell will sound at the end only if there are errors.
	+ It works fine with all the compile-class commands. Particularly,
	   if you say @DEBUG MYPROG.PAS, it will invoke the PASCAL debuger
	   properly (If you say @EXEC MYPROG.PAS/DEBUG, it will not work
	   yet, though).
	+ When calling it directly, you can default (by <cr>) the object
	   and list file names. They will be MYPROG.REL and MYPROG.LST,
	   respectively. Or you can default any of the file extensions.
	   they will be .REL, .LST and .PAS, respectively.
3. NEW COMPILER: PASSGO!
	+ An INCORE version, called PASSGO, was created. It is much faster
	   and it is compatible with PASCAL in everything except external
	   procedures. The extension for PASSGO programs is PGO.
∂24-jun-79  1503	ARR  Linkage conventions of the PASCAL/PASSGO/LOTS compilers

  LINKAGE CONVENTIONS OF THE PASCAL AND PASSGO COMPILERS FOR DEC-System10
		AND DEC-System20, HAMBURG AND LOTS VERSIONS
				Version 1.0

			    Armando R. Rodriguez
				  6-aug-79

Abstract:
	A semiformal description of the memory and ACregister mapping mechanism
	is given, together with a description of the linkage convention and the
	frame setup sequence, for code generated by the DEC10-DEC20 PASCAL
	compilers. Comments are added in some places, to clarify things for
	the reader who plans to write a routine in assembly language, and
	call it from PASCAL programs.

Acknowledgements:
	Thanks to Polle Zellweger and Dan Halbert, who pointed out flaws in the
	first draft, and helped getting ideas straight for this one.

Notation:
	a) All the references to ACregisters are octal numbers. The letter B
		after the number means octal.
	b) For relative addresses, assembly language notation is used:
		1(17B) means (contents of right half of 17B) plus one.

0. ACregister mapping:
	ACregister 17B points to the top of the stack.
	ACregister 16B points to the bottom of the current stack frame
		(the top of the stack for the caller, plus one)
	ACregister 15B points to the 'top' of the heap (the heap grows
		down from the top of the low segment towards the stack.)
	ACregisters 7 to 14B are used as an upside-down stack to keep
		WITH pointers (That is, it grows from 14B towards 7).
	Inside PASCAL code, the expression evaluation stack grows from
		ACregister 2 towards the WITH stack. (if it runs out of
		registers, PASCAL gives a compile time error. It does
		stack height reduction, so this rarely happens).
	ACregisters 2 to 6 will participate in the parameter passing.
		(The value 6 is the default value for the switch /REGISTER
		or compiler option (*$Xn*). See the manual[1] for details)
		If there is a nonempty expression evaluation stack (when
		calling a function to evaluate a parameter, only) then
		it is saved and restored by the caller.
	ACregisters 0 and 1 are never used by PASCAL-generated code:
		they are kept free, for the use of the runtime routines. If
		you are writting an assembly-language routine, and you don't
		call any runtime library routine, you are free to use them.

1. But, where is the display kept?
	The display is not kept as an entity. The dynamic link is carried
	around by the left half of ACregister 16B, and deposited in the last
	word of the caller's frame, in the left half also. This word was
	allocated by the caller for that specific purpose. So, to get the
	base of the frame for the caller of your caller (two levels), you
	use the left half of -1(16B), put it in ACregister X, and then use
	the left half of -1(X).

2. Things done by the caller on call:
	a) Save any live registers in the range 2 to 6, in temporary space
		in its own area, and from the range 14B down to 7, in the
		location of the corresponding pointer variable.
	b) Pass the parameters (see 3 below).
	c) Isue a PUSHJ 17B,<callee> to call.

3. Passing parameters:
	a) ACregisters 2 to 6 are used for the first parameters.
	b) VAR parameters:
		The address is passed. The callee will access them indirectly.
	c) Non-VAR parameters, one- and two-word long:
		The value is passed in the ACregisters. If it is a two-word,
		and the first word falls in ACregister 6, it is put there, and
		the second word goes to its target place BEYOND the stack.
	d) Non-VAR parameters, larger than two words:
		The address is passed in an ACregister.
	e) When the six ACregisters have been used up:
		what would have been passed through the ACregister is
		put directly in its place in memory BEYOND the top of the stack.

4. Memory mapping of the callee's area:
	starting in the base address (contents of 16B when in your area,
		contents of 17B plus 1, when beyond the stack):
	For procedures: 1(base) has the first parameter. Parameters are
		assigned memory in the order in which they were declared.
	For functions: 1(base) is where the returned value will be put.
		2(base) has the first parameter. Everything else is the same.
	local variables come after the parameters, almost in the order of
		declaration. (a group of variables declared by an id-list
		is allocated in reverse order).
	Any temporary save areas are allocated after the local variables.
		They are used as a compile-time-assigned stack, and the 
		highest level is allocated.
	An extra word is allocated for the dynamic link.

5. First things done by the callee:
	a) Reorganize ACregisters 16B and 17B to point to its own frame.
	b) Update the dynamic link by moving around halfs between 17B,
		16B and -1(16B).
	b) Copy the parameters from the ACregisters into their places in memory.
		+  Value (Non-VAR) parameters which are longer than two
		words: Take the address from the ACregister, or from the
		first word in its memory location (if it is an overflow
		parameter), and do a BLT (Block transfer).
		+  VAR parameters, and Non-VAR which are one or two words:
		If they are in ACregisters, copy them into their place in
		memory. If not, do nothing.

6. Registers that the callee can use:
	All of registers 2 to 14B. Any of them that were alive were saved by the
	caller. If you don't call any of the runtime library routines, you can
	use registers 0 and 1 also.

7. Last things done by the callee:
	a) Put back in place the left halfs of ACregisters 17 (PUSHJ count)
		and 16B (Dynamic link).
	b) Isue a POPJ 17B to go back.
	c) Nothing else. Even if it is a function, the result was put in its
		place if and when an assignment was made to the function
		identifier. (its place is 1(16B), or 1(17B) if you did not
		build your own frame).

8. Things done by the caller on return:
	a) Reconstruct its own frame.
	b) If it saved ACregisters in memory, bring them back to place.
	b) If the callee was a function, pick up the result from 2(17),
		and put it in an ACregister (the current top of the expression
		evaluation stack).

BIBLIOGRAPHY:

[1]	Rodriguez, Armando: Pascal and Passgo at LOTS, adapted from 
	Pascal for the DECsystem-20, by E. Kisicki and H.H.Nagel.
	Available on-line at LOTS and SCORE in DOC:PASCAL.MAN
	accessible at SU-AI by .READ PASMAN

∂ 8-jul-79  1628	ARR  Description of the symbol table data structure

DESCRIPTION OF THE DATA STRUCTURE THAT MAINTAINS THE SYMBOL TABLE IN THE
PASCAL AND PASSGO COMPILERS FOR DEC-10,DEC-20, LOTS AND HAMBURG VERSIONS.

			Armando R. Rodriguez.
			     8-jul-79

ABSTRACT - INTRODUCTION

The symbol table is formed with five basic elements: Constant descriptor
Blocks, Value descriptor blocks, Identifier Descriptor Blocks (CTP↑),
Structure (Type, mainly) descriptor Blocks (STP↑) and a main frame, that
keeps the symbol table and implements the scoping mechanism (DISPLAY).
The first two ones are extremely simple, and will not be described in this
document. The other three ones contain most of the useful imformation.
A brief global description of each record is made, and an explanation of
the meaning and usage of each field follows, retainng the CASEing structure
of the record. An excception is made in that the dummy fields are all des-
cribed together. When it seems appropriate, an explanation is given on the
meaning and purpose of each of the possible values of a given field.
The approach is not purely informal, but it is not absolutely rigurous.
The intention is to be rigurous enough to prevent ambiguities.
Comments and criticisms on this draft are welcome, encouraged and appreciated.
(See address information in the last page).

EXPLANATION OF SOME TERMS:

CHAIN: The linker provides a feature that this compiler takes good advantage
	of: When an address is needed that is not known, a "patchback request"
can be issued (Internalrequest, ITEM_10 is used for GOTOs and calls to FORWARD
procedures, and a Symbols, ITEM_2, for external procedure and runtime calls).
The request provides the address of the instruction that needs it and is 
situated in the highest position in memory. There, instead of the address that
will be patched back, the address of the next highest requestor is kept, so
forming a backwards (top-down?) chain of requestors of the same address. The
last element of the chain contains a zero (0). The current top of that chain
is kept in field GOTO_CHAIN for labels, LINKCHAIN for Procs/Funcs, and ...
VECTORCHAIN for scalars. Since the Linker does not participate in PASSGO runs,
PASSGO does tha backpatching itself with the procedure WALKCHAIN, instead of
the request made by PASCAL using the procedure WRITE_PAIR.

BASE TYPE and HOST TYPE: This is the terminology used in the proposed ISO 
			standard for PASCAL. Base type refers to the type of
the elements of a set, and Host type refers to the original type from which a
closed interval defines a subrange type.

LEVEL AND SCOPE: An identifier defined at a given level is assigned that level.
		 Its scope is all levels with a numerical value higher than
its own, that are not in the scope of another identifier with the same name and
a level with a numerical value higher than its own. Level 0 is assigned to pre-
declared objects, level 1 to global objects (declared in the main block) and
levels 2 and up to the local objects inside procedures and functions.

	THE STRUCTURE DESCRIPTOR BLOCK:

Its main purpose is to describe a type by its structure. No naming is 
managed directly by this record, although it will point to identifier 
descriptors in the case of declared scalars and fields of records.
The values of SCALKIND: TAGFWITHID, TAGFWITHOUTID and VARIANT are used to
describe parts of a record structure. All the other values have obvious
meanings. (POWER stands for powerset).

STP: Pointer to a STRUCTURE descriptor record
STRUCTURE: Structure descriptor record.
  DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7, DB9: Dummy fields used to get
	better addressing in the other fields.
  SELFSTP: Used to build the debugger tables: a copy of this record, with
		the pointer values changed to be meaningful at runtime.
  SIZE: Memory space needed by a variable of this type, in words.
  NOCODE: Flag set while dumping the debugging information, to prevent 
		from dumping a record twice.
  BITSIZE: Memory space needed, in bits, if this type is used to build a
		packed structure. (if SIZE > 1 word, BITSIZE = 1 word).

  FORM: Flag to distinguish the different structures. The names are obvious,
		and briefly described below.

    SCALAR: A simple type, except for subranges.
	SCALKIND: STANDARD: Integer, Real or ASCII (CHAR is a subrange)
		  DECLARED: Named scalars, including booleans.
	  FCONST: Pointer to the IDENTIFIER descriptor for the first member
		    of this type. They will be chained by their NEXT field.
	  VECTORADDR: Address of the string constant that contains all the
			names of the elements, ordered from value zero.
	  VECTORCHAIN: Top of the chain of references to VECTORADDR.
			See explanation on chains above.
	  DIMENSION: Ord(Last(this type)): The maximum value that is defined
			by a name in this type. It is also the number of
			elements minus one.
	  NEXTSCALAR: All type descriptors that describe declared (named) 
			scalars are chained through this field, to simplify 
			the dump of their name strings in WRITE_MACHINE_CODE
	  REQUEST: Flag that sets true if any formatted I/O (read/write) is
			done on this type, or it defines a parameter to an
			external procedure. Used to decide whether to dump 
			the string of names for runtime use.
	  TLEV: The scoping level at which the type was defined.

    SUBRANGE: Subrange type. Includes CHAR.
	RANGETYPE: Pointer to the STRUCTURE descriptor of the Host type.
	VMIN, VMAX: Minimum and maximum values of the closed range that 
			defines the subrange. (Subranges of real are suppor-
			ted).

    POINTER: Pointer Type.
	ELTYPE: Pointer to the STRUCTURE descriptor of the type this type
		will point to.

    POWER: Set type.
	ELSET: Pointer to the STRUCTURE descriptor of the Base type.

    ARRAYS: Array type.
	ARRAYPF: "Packed Flag": true if the elements of this array are packed
	ARRAYBPADDR: Address of a word in data area reserved for a byte pointer
			used for addressing elements of this array.
	AELTYPE: Pointer to the STRUCTURE descriptor of the type of the element
			of this array.
	INXTYPE: Pointer to the STRUCTURE descriptor of the type of the subs-
			cript of this array.

    RECORDS: Record type.
	RECORDPF: "Packed Flag".
	FSTFLD: Pointer to the IDENTIFIER descriptor of the first field of the
		non-variant part of this record. They will be chained through
		the NEXT field.
	RECVAR: Pointer to a STRUCTURE descriptor of FORM TAGFWITHID or ...
		TAGFWITHOUTID, from which the description of the variant part
		hangs. NIL if no variant part.

    FILES: File type.
	FILETYPE: Pointer to the STRUCTURE descriptor of the type of the
		    elements that form the sequence in this file, or, in other
		    words, the type of the so-called file_buffer_variable.
	FILEFORM: Binary value used by runtimes to distinguish a file that will
		    be used with formatted I/O (Text_file) from one that needs
		    Standard I/O (data_file).
	FILEMODE: Binary value used by the runtimes to distinguish a file that
		    has byte-long elements (TEXT, PACKED FILE OF ASCII) from
		    one that has n-word-long elements (all other files).

    TAGFWITHID: A tag field that uses physical memory space: points to     
		    the alterantive VARIANT part descriptors.
    TAGFWITHOUTID: Same, for a tag field that does not use memory space.
	FSTVAR: Pointer to the STRUCTURE descriptor for one of the alternative
		VARIANT parts of this record at this (casing) level. Notice 
		that the lexical level remains the same as long as the type
		of a field is not a record itself, so nested CASEs are still
		at the same level. The other VARIANT alternatives will be 
		chained through the NXTVAR field.
	TAGFIELDP: Pointer to the IDENTIFIER descriptor of a TAGFWITHID.
	TAGFIELDTYPE: Pointer to the STRUCTURE descriptor of a TAGFWITHOUTID.

    VARIANT: The structure that is 'active' in the variant part of a record,
		when the corresponding tag field has some given value.
	NXTVAR: Pointer to the STRUCTURE descriptor of the VARIANT part for 
		some other value of the tag field.
	SUBVAR: Pointer to the STRUCTURE descriptor of a TAGFWITHID or of a
		TAGFWITHOUTID that describes a variant part contained in this
		variant part, if any. (e.g., in this record type, STRUCTURE,
		the VARIANT  descriptor for FORM = SCALAR points through SUBVAR
		to the TAGFWITHID descriptor for SCALKIND).
	FIRSTFIELD: Pointer to the IDENTIFIER descriptor of the first field of
		this variant part.
	VARVAL: Value that the tag field should have for this VARIANT to be
		'active'. (valid/current).

	THE IDENTIFIER DESCRIPTOR BLOCK:

Its main purpose is to describe the meaning and properties of an identifier.
No structural information is reflected directly in this record, except for the
fact that declared scalars, parameter lists and fields are described by a chain
of identifier descriptors. The names used in the main variant part have obvious
meanings.

CTP: Pointer to an IDENTIFIER descriptor record.

IDENTIFIER: Identifier descriptor record.
  VDUMMY1, VDUMMY2, HDUMMY, PDUMMY: Dummy fields used to get better addressing
	in the rest of the fields.
  NAME: Of the identifier.
  LLINK, RLINK: To keep the identifiers of each level (scope) organized in a 
		binary search tree, by NAME.
  IDTYPE: Pointer to the STRUCTURE descriptor of the type of this constant,
	  variable, field or function. NIL otherwise.
  NEXT: Used to form chains of identifiers. Depending on KLASS, it points to:
	in KONST: (when it is a member of a declared type): the member of the
		  type with the internal value immediately lower than this one.
	in VARS: (When they describe a parameter of a procedure):
		  The next parameter.
	in FIELD: Next field of this static or variant part of this record type.
	in PROC and FUNC: (When they are ACTUAL): The first parameter.
	in LABELS: Next label that was declared at this same scope level.
	(This chains are complementary. All identifiers hang from RLINK, LLINK).
  SELFCTP: Used to build the debugger tables: a copy of this record, with the
		pointer values changed to be meaningful at runtime.
  NOCODE: Flag set while dumping the debugging information, to prevent from
		dumping a record twice.

  KLASS: Flag to distinguish the different kinds of identifiers. The names are
		obvious, and are briefly explained below.

    KONST: A constant. (either a name that defines a number, as declared in the 
		CONST part of a program, or an element of a declared scalar type)
	VALUES: Its numerical value.

    VARS: A variable. (either a parameter or a local variable).
	VKIND: ACTUAL: Local variable or value parameter.
	       FORMAL: VAR parameter.
	VLEV: The level (scope) at which it was declared.
	CHANNEL: For variables that are files, the actual hardware channel number
		 that will be requested for it at runtime.
	VADDR: Address of the place in memory that was assigned to it. For local
		variables and parameters, it is relative to the base of the stack
		frame (pointed to by ACregister 16B). [2]

    FIELD: A field of a record (either in a static or a variant part.)
	PACKF: "Packed" flag: (it should be called ALIGNMENT flag): information
		on the location of its starting address: either at a word boun-
		dary, or at a half-word boundary, or at some bit position inside
		the word, which requires a byte pointer to access it.
	NOTPACK,HWORDR,HWORDL: FLDADDR: Address of the field, relative to the 
		address of the record.
	PACKK: FLDBYTE: a descriptor of the bytepointer used to reach this field.

    PROC, FUNC: A procedure or function (either the proc/func itself, or an 
		EXTERN or FORWARD reference, or a proc/func declared as a
		parameter).
	PFDECLKIND: Distinction between standard and declared. (NOTE: This is
		not the PASCAL language meaning of standard and declared/prede-
		clared.)
	    STANDARD: it needs special parsing, either because it is decompo-
		sed into calls to different runtimes(READ/WRITE) or because it
		takes non-standard parameter lists (GET,PUT,BREAK,...) or
		because it is compiled inline (PACK/UNPACK, ABS,...).
	      KEY: subscript for its name in NA (STDFUNC or STDPROC)
	    DECLARED: it has no special treatment, so a call to it will be
		treated by the CALL_NON_STANDARD procedure.
	      PFLEV: level at which it was declared.
	      PARLISTSIZE: amount of memory space needed in the stack frame for
			    the parameters.
	      PFADDR: Address of the entry point, for a local procedure.
	      HIGHEST_REGISTER: Highest register used for parameter passing.
		  Usually 6. See the description of the /REGISTER:n switch, or
		  (*$Xn*) option [1]. See also [2]
	      PFKIND: flag to distinguish parameter procedures.
		ACTUAL: Not a parameter procedure.
		    FORWDECL: Flag. True if it was declared forward and the 
				body has not been compiled yet.
		    EXTERNDECL: True if it was declared external or if it is a
				predeclared procedure from the runtime library.
		    ACTIVATED: True while parsing inside the scope of this fun-
				ction, so that its appearence in the left side
				of an assignment is legal.
		    PFCHAIN: To keep three chains of IDENTIFIER descriptors:
				one for local, one for forward references, and
				one for external references, for ?, for Inter-
				nal requests, and for symbol requests, respec-
				tively.
		    LANGUAGE: Either PASCALSY or FORTRANSY, to apply the diffe-
				rent linkage conventions.
		    TESTFWDPTR: Chain of forward procedures declared at this 
				scope. For test on unsatisfied forward decla-
				rations.
		    EXTERNALNAME: To be used in the Symbols request to the 
				Linker.

		    LINKCHAIN: Top of the chain of references (calls) to this
				procedure/function. See explanation on chains
				above.
		FORMAL: A parameter procedure/function.
		    FPARAM: Poiner to the IDENTIFIER descriptor of the first
				parameter to this procedure. Note that these
				descriptors have no name, and are not inserted
				in the binary tree. [1]. (In actual procedures/
				functions, it is kept in NEXT, but here NEXT
				points to the next of the parameterlist in which
				this procedure is a member.)
		
    LABELS: A Declared Label.
	SCOPE: Level at which it was declared, which defines its scope.
	JUMP_INDEX: Subscript into JUMP_TABLE, which keeps the address where
			the ACregisters 16B and 17B (stack frame boundaries)
			are saved on entry. Used for GOTOs out of block.
	EXIT_JUMP: True if this label is the subject of a GOTO out of block.
	GOTO_CHAIN: Top of the chain of references to this label. See 
			explanation on chains above.
	LABEL_ADDRESS: The address in memory where a GOTO to this label should
			jump to.

	THE DISPLAY ARRAY:

The array variable DISPLAY is the mechanism that implements the scoping rules
of PASCAL: The most important component of each of its elements is the CTP
FNAME which points to the IDENTIFIER descriptor of the first name that was
declared in that scope. The rest of them hang from it in a binary search tree.
While parsing the declaration of a record type, and when inside a WITH state-
ment, the chain of fields of that record hang from one of the elements of
DISPLAY. The index in DISPLAY matches exactly the scope level for all other
cases. DISPLAY[0].FNAME points to the binary tree of predefined objects, and
so on. When the parsing of the body of a procedure is finished, the whole
binary tree that describes it is thrown away. The descriptors of its parameters
are still around, though, hanging from the NEXT field.

	BIBLIOGRAPHY AND ADDRESSING INFORMATION:

[1]	Rodriguez, Armando: Pascal and Passgo at LOTS, adapted from 
	Pascal for the DECsystem-20, by E. Kisicki and H.H.Nagel.
	Available on-line at LOTS and SCORE in DOC:PASCAL.MAN
	accessible at SU-AI by .READ PASMAN

[2]	Rodriguez, Armando: Linkage conventions of the Pascal compier,
	for DEC-System10 and DEC-System20, Hamburg and Lots versions.
	Available on-line at LOTS and SCORE in DOC:PASCAL.DOC;
	Accessible at SU-AI by .READ PASNOT/5p

The documents described above, and this one, are part of the documenta-
	tion included in the distribution package of PASCAL/PASSGO, 
	LOTS version.

This document is accessible at SU-AI by .READ PASNOT/6p, It is available
	on-line at LOTS and SCORE in DOC:PASCAL.DOC.


		Armando R. Rodriguez
		Computer Science Departament
		Stanford University
		Stanford, Ca 94305
		U.S.A.

		P.O. Box 5771
		Stanford, Ca 94305
		U.S.A.


		(415)497-4971
		ARR@SU-AI, CSL.ARMANDO@SCORE
		A.ARMANDO@LOTS

∂10-jul-79  1628	ARR  Packing Policy

     PACKING POLICY OF THE PASCAL AND PASSGO COMPILERS FOR DECSystem-10
		AND DECSystem-20, LOTS AND HAMBURG VERSIONS.

			    Armando R. Rodriguez.
				 10-jul-79

INTRODUCTION:

The standard only says that the use of the reserved word PACKED in a type defi-
nition is an indication to the compiler that it should use a packing mechanism,
But it does not define the mechanism, an it implies that one way of doing it is
by doing nothing. PASCAL/PASSGO do have a mechanism, that tries to provide both
a reasonable packed space and the least possible loss in addressing efficiency,
by preventing potentially large (one-word long or more) objects from getting
aligned to a bit address, and by taking advantage of the half-word addressing
mechanism of the DEC-10 hardware.

POLICY:

The order of definition of this rules is intended for clarity only. It does 
not imply any precedence rule. The rules should be mutually exclusive. If 
there is any ambiguity, it is a bug in this document: Please tell ARR.

1. Every new variable is aligned at a new word boundary.

2. Every array or record, even if it is an element of a packed array or a field
	of a packed record, is aligned at a new word boundary and has a size 
	given in full words, regerdless of whether it itself is packed.

4. Packed Files of ASCII or of a subrange of ASCII (e.g., CHAR) are actually 
	accessed at byte boundaries. PACKED has no effect on files of any other
	type, that is, GETs and PUTs will move around full words.

5. In fields of records and elements of arrays, except for the previous rules:
    A. Pointers are kept in half a word.
    C. When the size of an object is larger than what is left of this word,
	the object is aligned to the next word.
    D. When the type of an object is a subrange of integer, but its lower bound
	is negative, its size is a full word, and it is alligned to the next
	word boundary.
    E. All other cases are packed to the exact number of bits that they need,
	and alligned in the next available bit. (boolean uses 1 bit, ASCII and
	its subranges, 1 byte, that is, 7 bits).


THINGS THAT YOU CAN DO:

There are things that the compiler will not do, that you can do fairly easily,
by using the appropriate dummy fields to force an alignment that would give
you better addressing at runtime:

    A. When the size of an object is exactly half a word (18 bits), the compiler
	will not do anything special, but if it also happens to be aligned at
	a half-word boundary, half-word addressing and moving will be used.

    B. When you need the elements of one record to map all into one only word,
	you have to do two things: (a) (obviously) make sure that the total
	sum of the bit space needed is 36 or less, and (b) make sure that none
	of the types of the fields is an array or record: even if it is packed,
	it will alocate a full word for itself, and align at a new word boun-
	dary.
	EXAMPLES:

1. The next record fits in exactly one word: (36 bits)	(thanks to DH)

VAR
    A: packed record
	a1: 0..63;	(* will be 6 bits *)
	a2: 31..33;	(* also 6 bits *)
	a3: 4094..4095; (* 12 bits *)
	a4: ' '..'9';	(* 7 bits *)
	a5: 0..31;	(* 5 bits. *)
   end;

2. some combinations of types:

TYPE
    a = packed array[1..10] of boolean;		(*1 word*)
    b = array[1..10] of boolean;		(*10 words*)
    c = packed array[1..10,1..10] of boolean;	(*10 words*)
    d = packed array[1..10] of a;		(*10 words*)
    e = packed array[1..10] of b;		(*100 words*)
    f = packed array[1..10] of array[1..10] of boolean;	(*100 words*)


∂20-jul-79  1433	ARR  List of Error messages

The number is the index that the compiler knows the error by.

	151 : ":" EXPECTED   
	152 : ")" EXPECTED   
	153 : "(" EXPECTED   
	154 : "[" EXPECTED   
	155 : "]" EXPECTED   
	156 : ";" EXPECTED   
	157 : "=" EXPECTED   
	158 : "," EXPECTED   
	159 : ":=" EXPECTED  
	160 : "OF" EXPECTED  
	161 : "DO" EXPECTED  
	162 : "IF" EXPECTED  
	163 : "END" EXPECTED 
	164 : "THEN" EXPECTED
	165 : "EXIT" EXPECTED
	166 : ILLEGAL SYMBOL 
	167 : NO SIGN ALLOWED
	168 : NUMBER EXPECTED
	169 : NOT IMPLEMENTED
	170 : ERROR IN TYPE  
	171 : COMPILER ERROR 
	172 : DEVICE EXPECTED
	173 : ERROR IN FACTOR
	174 : TOO MANY DIGITS

	201 : "BEGIN" EXPECTED    
	202 : "UNTIL" EXPECTED    
	203 : ERROR IN OPTIONS    
	204 : CONSTANT TOO LARGE  
	205 : DIGIT MUST FOLLOW   
	206 : EXPONENT TOO LARGE  
	207 : CONSTANT EXPECTED   
	208 : SIMPLE TYPE EXPECTED
	209 : IDENTIFIER EXPECTED 
	210 : REALTYPE NOT ALLOWED
	211 : MULTIDEFINED LABEL  
	212 : FILENAME EXPECTED   
	213 : SET TYPE EXPECTED   
	214 : UNDEFINED LABEL     
	215 : UNDECLARED LABEL    

	251 : "TO"/"DOWNTO" EXPECTED   
	252 : 8 OR 9 IN OCTAL NUMBER   
	253 : IDENTIFIER NOT DECLARED  
	254 : FILE NOT ALLOWED HERE    
	255 : INTEGER CONSTANT EXPECTED
	256 : ERROR IN PARAMETERLIST   
	257 : ALREADY FORWARD DECLARED 
	258 : THIS FORMAT FOR REAL ONLY
	259 : VARIANTTYPE MUST BE ARRAY
	260 : TYPE CONFLICT OF OPERANDS
	261 : MULTIDEFINED CASE LABEL  
	262 : FOR INTEGER ONLY "O"/"H" 
	263 : ARRAY INDEX OUT OF BOUNDS
	264 : MISSING FILE DECLARATION 
	265 : LABEL CONSTANT TOO GREAT 
	266 : LABEL ALREADY DECLARED   
	267 : END OF PROGRAM NOT FOUND 
	268 : MORE THAN 72 SET ELEMENTS

	301 : STRING CONSTANT IS TOO LONG   
	302 : IDENTIFIER ALREADY DECLARED   
	303 : SUBRANGE BOUNDS MUST BE SCALAR
	304 : INCOMPATIBLE SUBRANGE TYPES   
	305 : INCOMPATIBLE WITH TAGFIELDTYPE
	306 : INDEX TYPE MAY NOT BE INTEGER 
	307 : TYPE OF VARIABLE IS NOT ARRAY 
	308 : TYPE OF VARIABLE IS NOT RECORD
	309 : NO SUCH FIELD IN THIS RECORD  
	310 : EXPRESSION TOO COMPLICATED    
	311 : ILLEGAL TYPE OF OPERAND(S)    
	312 : TESTS ON EQUALITY ALLOWED ONLY
	313 : STRICT INCLUSION NOT ALLOWED  
	314 : FILE COMPARISON NOT ALLOWED   
	315 : ILLEGAL TYPE OF EXPRESSION    
	316 : VALUE OF CASE LABEL TOO LARGE 
	317 : TOO MANY NESTED WITHSTATEMENTS
	318 : INVALID OR NO PROGRAM HEADING 
	319 : TOO MANY LABEL DECLARATIONS   
	320 : INCOMPATIBLE FORMALPARAMETER  
	321 : STRING PACKAGE IS DISABLED

	351 : STRING CONSTANT CONTAINS "<CR><LF>"
	352 : LABEL NOT DECLARED ON THIS LEVEL   
	353 : CALL NOT ALLOWED IN EXTERN PROGRAMS
	354 : MORE THAN 12 FILES DECLARED BY USER
	355 : FILE AS VALUE PARAMETER NOT ALLOWED
	356 : TOO MUCH CODE: USE OPTION CODESIZE 
	357 : NO PACKED STRUCTURE ALLOWED HERE   
	358 : VARIANT MUST BELONG TO TAGFIELDTYPE
	359 : TYPE OF OPERAND(S) MUST BE BOOLEAN 
	360 : SET ELEMENT TYPES NOT COMPATIBLE   
	361 : ASSIGNMENT TO FILES NOT ALLOWED    
	362 : TOO MANY LABELS IN THIS PROCEDURE  
	363 : INITPROCEDURE NOT ALLOWED HERE     
	364 : CONTROL VARIABLE MAY NOT BE FORMAL 
	365 : ILLEGAL TYPE OF FOR-CONTROLVARIABLE
	366 : ONLY PACKED FILE OF CHAR ALLOWED   
	367 : CONSTANT NOT IN BOUNDS OF SUBRANGE 

	401 : IDENTIFIER IS NOT OF APPROPRIATE CLASS  
	402 : TAGFIELD TYPE MUST BE SCALAR OR SUBRANGE
	403 : INDEX TYPE MUST BE SCALAR OR SUBRANGE   
	404 : TOO MANY NESTED SCOPES OF IDENTIFIERS   
	405 : POINTER FORWARD REFERENCE UNSATISFIED   
	406 :                                         
	407 : TYPE OF VARIABLE MUST BE FILE OR POINTER
	408 : MISSING CORRESPONDING VARIANTDECLARATION
	409 : MORE THAN 6 VARIANTS IN CALL OF "NEW"   
	410 : MORE THAN FOUR ERRORS IN THIS SOURCELINE
	411 : NO INITIALISATION ON RECORDS OR FILES   
	412 : PROGRAM TOO BIG FOR PASSGO. USE PASCAL  
	413 : MORE THAN 100 INITPROCEDURES. USE PASCAL

	451 : LOW BOUND MAY NOT BE GREATER THAN HIGH BOUND 
	452 : IDENTIFIER OR "CASE" EXPECTED IN FIELDLIST   
	453 : TOO MANY NESTED PROCEDURES AND/OR FUNCTIONS  
	454 : FILE DECLARATION IN PROCEDURES NOT ALLOWED   
	455 : MISSING RESULT TYPE IN FUNCTION DECLARATION  
	456 : ASSIGNMENT TO FORMAL FUNCTION IS NOT ALLOWED 
	457 : INDEX TYPE IS NOT COMPATIBLE WITH DECLARATION
	458 : ERROR IN TYPE OF STANDARD PROCEDURE PARAMETER
	459 : ERROR IN TYPE OF STANDARD FUNCTION PARAMETER 
	460 : REAL AND STRING TAGFIELDS NOT IMPLEMENTED    
	461 : SET ELEMENT TYPE MUST BE SCALAR OR SUBRANGE  
	462 : ONLY ASSIGNMENTS ALLOWED IN INITPROCEDURES   
	463 : NO CONSTANT OR EXPRESSION FOR VAR ARGUMENT   
	464 : EXTERN DECLARATION NOT ALLOWED IN PROCEDURES 
	465 : BODY OF FORWARD DECLARED PROCEDURE MISSING   
	466 : DOUBLE FILE SPECIFICATION IN PROGRAM HEADING 
	467 : TOO MUCH CODE FOR DEBUG: TRY MORE "CODESIZE" 
	468 : NO FORMAL-PROC/FUNC IN FORTRAN-SUBROUTINE    
	469 : THIS VAR ARGUMENT HAS TO BE OF TYPE STRING   
	470 : GLOBAL VARIABLES REQUIRE TOO MUCH MEMORYSPACE

	501 : TOO MANY FORWARD REFERENCES OF PROCEDURE ENTRIES  
	502 : ASSIGNMENT TO STANDARD FUNCTION IS NOT ALLOWED    
	503 : PARAMETER TYPE DOES NOT AGREE WITH DECLARATION    
	504 : INITIALISATION ONLY BY ASSIGNMENT OF CONSTANTS    
	505 : LABEL TYPE INCOMPATIBLE WITH SELECTING EXPRESSION 
	506 : PREV. STATEMENT MISSING ";","END","ELSE"OR"UNTIL" 
	507 : NOT ALLOWED IN INITPROCEDURES (PACKED STRUCTURE?) 
	508 : GOTO INTO MAIN PROGRAM NOT ALLOWED IF "EXTERN"    
	509 : ASSIGNMENT TO FUNCTION NOT ALLOWED ON THIS LEVEL  
	510 : NO STD- OR FORTRAN-PROC/FUNC AS ACTUAL-PROC/FUNC  

	551 : FUNCTION RESULT TYPE MUST BE SCALAR,SUBRANGE OR POINTER
	552 : REPETITION OF RESULT TYPE NOT ALLOWED IF FORW. DECL.   
	553 : REPETITION OF PARAMETER LIST NOT ALLOWED IF FORW. DECL.
	554 : NUMBER OF PARAMETERS DOES NOT AGREE WITH DECLARATION   
	555 : RESULT TYPE OF PARAMETER-FUNC DOES NOT AGREE WITH DECL.
	556 : SELECTED EXPRESSION MUST HAVE TYPE OF CONTROL VARIABLE 
	557 : TOO MANY FILES OR TOO BIG FILE ELEMENTS. USE PASCAL.   
	558 : ALREADY DECLARED. PREVIOUS DECLARATION WAS NOT FORWARD